package com.gitee.free.coding.admin.system.service;

import com.gitee.free.coding.admin.system.req.SystemLoginReq;
import com.gitee.free.coding.admin.system.res.body.SystemLoginResBody;
import com.gitee.free.coding.admin.system.res.body.SystemVerificationCodeResBody;
import com.gitee.free.coding.core.group.LoginGroup;
import com.gitee.free.coding.core.group.RegisterGroup;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;

/**
 * <p>
 * 服务类
 * </p>
 * <p>
 * 在 Spring 框架中，@Valid 注解通常与 Controller 层结合使用，用于在 HTTP 请求处理过程中进行参数验证。
 * 在 Service 层中直接使用 @Valid 注解通常不会生效，因为 Spring 的 MethodValidationPostProcessor 默认仅针对 Controller 层的方法参数进行验证。
 * 可以使用 @Validated 注解与 AOP 结合来在 Service 层实现方法验证。
 * 需要在 Service 层类上添加 @Validated 注解，并确保 MethodValidationPostProcessor 被配置为处理 Service 层的 bean
 * </p>
 * <p>
 * 若要使用分组属性时，必须满足以下几点：
 * ---- 1、在类上加上 @Validated ;
 * ---- 2、在方法上加上分组 @Validated(RegisterGroup.class) ;
 * ---- 3、在参数前面加上 @Valid ;
 * </p>
 * <p>
 * 注意：@Valid 注解放在接口实现类上时，会抛出异常。
 * ---- HV000151: A method overriding another method must not redefine the parameter constraint configuration,
 * ---- but method SystemUserAuthServiceImpl#login(SystemLoginReq) redefines the configuration of ISystemUserAuthService#login(SystemLoginReq).
 * </p>
 *
 * @author liaoen
 * @since 2024-05-29 22:44:05
 */
@Validated
public interface ISystemUserAuthService {

    SystemVerificationCodeResBody generateVerificationCode();

    @Validated(RegisterGroup.class)
    void register(@Valid SystemLoginReq systemLoginReq);

    @Validated(LoginGroup.class)
    SystemLoginResBody login(@Valid SystemLoginReq systemLoginReq);

}
